/**
 * Validator.java
 * Created at 2015年7月13日
 * Created by Jackie Liu
 * Copyright (C) 2015 TONGHE, All rights reserved.
 */
package com.huabo.utils;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.ServletRequestUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>ClassName: Validator</p>
 * <p>Description: 通用Spring MVC字段验证类</p>
 * <p>Author: Jackie Liu</p>
 * <p>Date: 2015年7月13日</p>
 */
public class Validator {

	//验证失败的提示列表
	private List<String> errorList;
	
	public Validator() {
		errorList = new ArrayList<String>();
	}
	
	/**
	 * <p>Description: 获取验证失败次数</p>
	 * @return
	 */
	public int getErrorNumber() {
		return errorList.size();
	}
	
	/**
	 * <p>Description: 是否验证通过</p>
	 * @return
	 */
	public boolean isSuccess() {
		if (!errorList.isEmpty()) {
            return false;
        } else {
            return true;
        }
	}
	
	/**
	 * <p>Description: 获取错误提示消息列表</p>
	 * @return
	 */
	public List<String> getErrorList() {
		return errorList;
	}
	
	/**
	 * <p>Description: 验证是否未通过</p>
	 * @return
	 */
	public boolean isError() {
		return !isSuccess();
	}
	
	/**
	 * <p>Description: 获取第一次验证失败时的字符串</p>
	 * @return
	 */
	public String getMessage() {
		if (isError()) {
			return errorList.get(0);
		}
		return null;
	}
	
	private void setMessage(String tipMessage) {
		errorList.add(tipMessage);
	}
	
	/**
	 * <p>Description: 验证非空</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或null返回false，否则返回true
	 */
	public boolean required(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)) {
			setMessage(tipMessage);
			return false;
		}
		return true;
	}
	
	/**
	 * <p>Description: 验证手机号格式</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或符合手机号格式返回true，否则返回false
	 */
	public boolean mobile(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateMobile(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证Email格式</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或符合Email格式返回true，否则返回false
	 */
	public boolean email(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateEmail(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证url格式</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或符合URL格式返回true，否则返回false
	 */
	public boolean url(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateUrl(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证数字(包括浮点数)</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或符合数字格式返回true，否则返回false
	 */
	public boolean number(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateNumber(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证整数</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或是整数格式返回true，否则返回false
	 */
	public boolean digits(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateInteger(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
     * <p>Description: 验证正整数</p>
     * @param request HttpServletRequest对象
     * @param key 验证字段名称
     * @param tipMessage 提醒信息
     * @return 如果验证字段值为空或是正整数格式返回true，否则返回false
     */
    public boolean zIndex(HttpServletRequest request, String key, String tipMessage) {
        String value = ServletRequestUtils.getStringParameter(request, key, null);
        if (StringUtils.isEmpty(value)
                || ValidateUtils.validateZIndex(value)) {
            return true;
        }
        
        setMessage(tipMessage);
        return false;
    }
	
	/**
	 * <p>Description: 验证字符串最小长度</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param minLength 最小长度
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值不为空或长度大于等于minLength返回true，否则返回false
	 */
	public boolean minLength(HttpServletRequest request, String key, int minLength, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value) 
				|| value.length() >= minLength) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证字符串最大长度</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param maxLength 最大长度
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或长度小于等于maxLength返回true,否则返回false
	 */
	public boolean maxLength(HttpServletRequest request, String key, int maxLength, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value) 
				|| value.length() <= maxLength) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证最小值</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param min 最小值
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或大于等于min返回true,否则返回false
	 */
	public boolean min(HttpServletRequest request, String key, double min, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| Double.parseDouble(value) >= min) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证最大值</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param max 最大值
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或小于等于max值返回true,否则返回false
	 */
	public boolean max(HttpServletRequest request, String key, double max, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| Double.parseDouble(value) <= max) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 验证长度</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param length 长度值
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或长度和length相等返回true，否则返回false
	 */
	public boolean equalLength(HttpServletRequest request, String key, int length, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| value.length() == length) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 身份证验证</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或格式正确返回true,否则返回false
	 */
	public boolean idCard(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateIDcard(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}
	
	/**
	 * <p>Description: 座机号验证</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或格式正确返回true,否则返回false
	 */
	public boolean telephone(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isEmpty(value)
				|| ValidateUtils.validateTel(value)) {
            return true;
        }
		
		setMessage(tipMessage);
		return false;
	}

	/**
	 * <p>Description: 密码验证(大写字母、小写字母、特殊字符、数字 两种两种以上组合匹配,6-18位))</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或格式正确返回true,否则返回false
	 */
	public boolean password(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isNotEmpty(value)
				&& ValidateUtils.validatePasswordReg2(value)) {
            return true;
        }

		setMessage(tipMessage);
		return false;
	}

	/**
	 * <p>Description: 验证字母</p>
	 * @param request HttpServletRequest对象
	 * @param key 验证字段名称
	 * @param tipMessage 提醒信息
	 * @return 如果验证字段值为空或格式正确返回true,否则返回false
	 */
	public boolean letter(HttpServletRequest request, String key, String tipMessage) {
		String value = ServletRequestUtils.getStringParameter(request, key, null);
		if (StringUtils.isNotEmpty(value)
				&& ValidateUtils.validateLetter(value)) {
            return true;
        }

		setMessage(tipMessage);
		return false;
	}
}
